﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using PH.Map;
using PH.Common;

namespace Hoshimi.Final
{
    public class Util
    {
        public static int Distancia_Manhatan(Point a, Point b)
        {
            return Math.Abs(a.X - b.X) + Math.Abs(a.Y - b.Y);
        }

        public static double Distancia(Point a, Point b)
        {
            return Math.Sqrt(Math.Pow((double)(b.X - a.X), 2) + Math.Pow((double)(b.Y - a.Y), 2));
        }

        public static Point PuntoMedio(Point a, Point b)
        {
            return new Point((a.X + b.X) / 2, (a.Y + b.Y) / 2);
        }

        public static Point PuntoMedio(Point[] puntos)
        {
            if (puntos == null || puntos.Length == 0) return Point.Empty;

            int sumX = 0;
            int sumY = 0;
            foreach (Point p in puntos)
            {
                sumX += p.X;
                sumY += p.Y;
            }

            int x = (int)Math.Round(1f * sumX / puntos.Length);
            int y = (int)Math.Round(1f * sumY / puntos.Length);

            return new Point(x, y);
        }

        public static Point PuntoMasCercano(Point ubicacion, List<Entity> entidades)
        {
            Point masCercano = Point.Empty;
            int distanciaMenor = 200 * 200;
            foreach (Entity ent in entidades)
            {
                Point destino = new Point(ent.X, ent.Y);
                int distancia = Distancia_Manhatan(destino, ubicacion);
                if (distancia < distanciaMenor)
                {
                    distanciaMenor = distancia;
                    masCercano = destino;
                }
            }

            return masCercano;
        }

        public static Point PuntoMasCercano(Point ubicacion, List<Point> puntos)
        {
            Point masCercano = Point.Empty;
            int distanciaMenor = 200 * 200;
            foreach (Point destino in puntos)
            {
                int distancia = Distancia_Manhatan(destino, ubicacion);
                if (distancia < distanciaMenor)
                {
                    distanciaMenor = distancia;
                    masCercano = destino;
                }
            }
            return masCercano;
        }

        public static Point PuntoMasCercano(Point ubicacion, List<Entity> entidades, List<Point> exceptuados)
        {
            Point masCercano = Point.Empty;
            int distanciaMenor = 200 * 200;
            foreach (Entity entidad in entidades)
            {
                Point destino = new Point(entidad.X, entidad.Y);
                bool pExceptuado = false;
                if (exceptuados != null)
                {
                    foreach (Point excep in exceptuados)
                    {
                        if (destino == excep)
                        {
                            pExceptuado = true;
                            break;
                        }
                    }
                }
                if (!pExceptuado)
                {
                    int distancia = Distancia_Manhatan(destino, ubicacion);
                    if (distancia < distanciaMenor)
                    {
                        distanciaMenor = distancia;
                        masCercano = destino;
                    }
                }
            }
            return masCercano;
        }

        public static Point PuntoMasCercano(Point ubicacion, List<Point> puntosValidos, List<Point> puntosExceptuados)
        {
            Point masCercano = Point.Empty;
            int distanciaMenor = 200 * 200;
            foreach (Point pValido in puntosValidos)
            {
                bool excep = false;
                if (puntosExceptuados != null)
                {
                    foreach (Point pExceptuado in puntosExceptuados)
                    {
                        if (pValido == pExceptuado)
                        {
                            excep = true;
                            break;
                        }
                    }
                }
                if (!excep)
                {

                    int distancia = Distancia_Manhatan(pValido, ubicacion);
                    if (distancia < distanciaMenor)
                    {
                        distanciaMenor = distancia;
                        masCercano = pValido;
                    }
                }
            }
            return masCercano;
        }

        public static Point PuntoMasCercano(Point ubicacion, List<Point> puntosValidos, List<Point> puntosExceptuados, List<Point> MasPuntosExceptuados)
        {
            Point masCercano = Point.Empty;
            int distanciaMenor = 200 * 200;

            foreach (Point pValido in puntosValidos)
            {
                bool excep = false;
                if (puntosExceptuados != null)
                {
                    foreach (Point pExceptuado in puntosExceptuados)
                    {
                        if (pValido == pExceptuado)
                        {
                            excep = true;
                            break;
                        }
                        if (MasPuntosExceptuados != null)
                        {
                            foreach (Point MpExceptuado in MasPuntosExceptuados)
                            {
                                if (pValido == MpExceptuado)
                                {
                                    excep = true;
                                    break;
                                }
                            }
                        }

                    }
                }

                if (!excep)
                {

                    int distancia = Distancia_Manhatan(pValido, ubicacion);
                    if (distancia < distanciaMenor)
                    {
                        distanciaMenor = distancia;
                        masCercano = pValido;
                    }
                }
            }
            return masCercano;
        }

    }
}